// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
//
//------------------------------------------------------------------------------
// This code was generated by google-apis-code-generator 1.5.1
//
//  Changes to this file may cause incorrect behavior and will be lost if
//  the code is regenerated.
//------------------------------------------------------------------------------
#ifndef  GOOGLE_WAX_API_WAX_SERVICE_H_
#define  GOOGLE_WAX_API_WAX_SERVICE_H_

#include <string>
#include "googleapis/base/macros.h"
#include "googleapis/client/service/client_service.h"
#include "googleapis/client/util/status.h"
#include "googleapis/client/util/uri_template.h"

#include "google/wax_api/subscription.h"
#include "google/wax_api/wax_create_session_request.h"
#include "google/wax_api/wax_data_item.h"
#include "google/wax_api/wax_list_response.h"
#include "google/wax_api/wax_new_session_request.h"
#include "google/wax_api/wax_new_session_response.h"
#include "google/wax_api/wax_remove_session_request.h"
#include "google/wax_api/wax_remove_session_response.h"


namespace google_wax_api {
using namespace googleapis;
/**
 * \mainpage
 *   Wax API Version v1
 *
 * \section ApiInfo API Version Information
 *    <table>
 *      <tr><th>API
 *          <td><a href='http://go/apiarytesting/wax-api'>Wax API</a>
 *      <tr><th>API Version<td>v1
 *      <tr><th>API Rev<td>20130321
 *      <tr><th>API Docs
 *          <td><a href='http://go/apiarytesting/wax-api'>
 *              http://go/apiarytesting/wax-api</a>
 *      <tr><th>Discovery Name<td>wax
 *    </table>
 *
 * \section ForMoreInfo For More Information
 *
 * The complete API documentation for using Wax API can be found at
 * <a href='http://go/apiarytesting/wax-api'>http://go/apiarytesting/wax-api</a>.
 *
 * For more information about the Google APIs Client Library for C++, see
 * <a href='https://developers.google.com/api-client-library/cpp/start/get_started'>
 * https://developers.google.com/api-client-library/cpp/start/get_started</a>
 */
class WaxService;

/**
 * Implements a common base method for all methods within the WaxService.
 *
 * This class defines all the attributes common across all methods.
 * It does not pertain to any specific service API so is not normally
 * explicitly instantiated.
 */
class WaxServiceBaseRequest
      : public client::ClientServiceRequest {
 public:
  /**
   * Standard constructor.
   *
   * @param[in] service  The service instance to send to when executed.
   *        In practice this will be supplied internally by the service
   *        when it acts as a method factory.
   *
   * @param[in] credential  If not NULL then the credential to authorize with.
   *        In practice this is supplied by the user code that is creating
   *        the method instance.
   *
   * @param[in] method  The HTTP method to use for the underlying HTTP request.
   *        In practice this is specified by the particular API endpoint and
   *        supplied internally by the derived class for that endpoint.
   *
   * @param[in] uri_template  The <a href='http://tools.ietf.org/html/rfc6570'>
   *        RFC 6570 URI Template</a> specifying the url to invoke
   *        The parameters in the template should be resolvable attributes.
   *        In practice this parameter is supplied internally by the derived
   *        class for the endpoint.
   */
  WaxServiceBaseRequest(
      const client::ClientService* service,
      client::AuthorizationCredential* credential,
      client::HttpRequest::HttpMethod method,
      const StringPiece& uri_template);

  /**
   * Standard destructor.
   */
  virtual ~WaxServiceBaseRequest();


  /**
   * Clears the '<code>alt</code>' attribute so it is no longer set.
   */
  void clear_alt() {
    _have_alt_ = false;
    client::ClearCppValueHelper(&alt_);
  }


  /**
   * Gets the optional '<code>alt</code>' attribute.
   *
   * If the value is not set then the default value will be returned.
   */
  const string& get_alt() const { return alt_; }

  /**
   * Gets a modifiable pointer to the optional <code>alt</code>' attribute.
   *
   * @return  The value can be set by dereferencing the pointer.
   */
  string* mutable_alt() {
    _have_alt_ = true;
    return &alt_;
  }


  /**
   * Sets the '<code>alt</code>' attribute.
   *
   * @param[in] value Data format for the response.
   */
  void set_alt(const string& value) {
    _have_alt_ = true;
    alt_ = value;
  }



  /**
   * Clears the '<code>fields</code>' attribute so it is no longer set.
   */
  void clear_fields() {
    _have_fields_ = false;
    client::ClearCppValueHelper(&fields_);
  }


  /**
   * Gets the optional '<code>fields</code>' attribute.
   *
   * If the value is not set then the default value will be returned.
   */
  const string& get_fields() const { return fields_; }

  /**
   * Gets a modifiable pointer to the optional <code>fields</code>' attribute.
   *
   * @return  The value can be set by dereferencing the pointer.
   */
  string* mutable_fields() {
    _have_fields_ = true;
    return &fields_;
  }


  /**
   * Sets the '<code>fields</code>' attribute.
   *
   * @param[in] value Selector specifying which fields to include in a partial
   * response.
   */
  void set_fields(const string& value) {
    _have_fields_ = true;
    fields_ = value;
  }



  /**
   * Clears the '<code>key</code>' attribute so it is no longer set.
   */
  void clear_key() {
    _have_key_ = false;
    client::ClearCppValueHelper(&key_);
  }


  /**
   * Gets the optional '<code>key</code>' attribute.
   *
   * If the value is not set then the default value will be returned.
   */
  const string& get_key() const { return key_; }

  /**
   * Gets a modifiable pointer to the optional <code>key</code>' attribute.
   *
   * @return  The value can be set by dereferencing the pointer.
   */
  string* mutable_key() {
    _have_key_ = true;
    return &key_;
  }


  /**
   * Sets the '<code>key</code>' attribute.
   *
   * @param[in] value API key. Your API key identifies your project and provides
   * you with API access, quota, and reports. Required unless you provide an
   * OAuth 2.0 token.
   */
  void set_key(const string& value) {
    _have_key_ = true;
    key_ = value;
  }



  /**
   * Clears the '<code>oauth_token</code>' attribute so it is no longer set.
   */
  void clear_oauth_token() {
    _have_oauth_token_ = false;
    client::ClearCppValueHelper(&oauth_token_);
  }


  /**
   * Gets the optional '<code>oauth_token</code>' attribute.
   *
   * If the value is not set then the default value will be returned.
   */
  const string& get_oauth_token() const { return oauth_token_; }

  /**
   * Gets a modifiable pointer to the optional <code>oauth_token</code>'
   * attribute.
   *
   * @return  The value can be set by dereferencing the pointer.
   */
  string* mutable_oauthToken() {
    _have_oauth_token_ = true;
    return &oauth_token_;
  }


  /**
   * Sets the '<code>oauth_token</code>' attribute.
   *
   * @param[in] value OAuth 2.0 token for the current user.
   */
  void set_oauth_token(const string& value) {
    _have_oauth_token_ = true;
    oauth_token_ = value;
  }



  /**
   * Clears the '<code>prettyPrint</code>' attribute so it is no longer set.
   */
  void clear_pretty_print() {
    _have_pretty_print_ = false;
    client::ClearCppValueHelper(&pretty_print_);
  }


  /**
   * Gets the optional '<code>prettyPrint</code>' attribute.
   *
   * If the value is not set then the default value will be returned.
   */
  bool get_pretty_print() const { return pretty_print_; }

  /**
   * Sets the '<code>prettyPrint</code>' attribute.
   *
   * @param[in] value Returns response with indentations and line breaks.
   */
  void set_pretty_print(bool value) {
    _have_pretty_print_ = true;
    pretty_print_ = value;
  }

  /**
   * Clears the '<code>quotaUser</code>' attribute so it is no longer set.
   */
  void clear_quota_user() {
    _have_quota_user_ = false;
    client::ClearCppValueHelper(&quota_user_);
  }


  /**
   * Gets the optional '<code>quotaUser</code>' attribute.
   *
   * If the value is not set then the default value will be returned.
   */
  const string& get_quota_user() const { return quota_user_; }

  /**
   * Gets a modifiable pointer to the optional <code>quotaUser</code>'
   * attribute.
   *
   * @return  The value can be set by dereferencing the pointer.
   */
  string* mutable_quotaUser() {
    _have_quota_user_ = true;
    return &quota_user_;
  }


  /**
   * Sets the '<code>quotaUser</code>' attribute.
   *
   * @param[in] value Available to use for quota purposes for server-side
   * applications. Can be any arbitrary string assigned to a user, but should
   * not exceed 40 characters. Overrides userIp if both are provided.
   */
  void set_quota_user(const string& value) {
    _have_quota_user_ = true;
    quota_user_ = value;
  }



  /**
   * Clears the '<code>userIp</code>' attribute so it is no longer set.
   */
  void clear_user_ip() {
    _have_user_ip_ = false;
    client::ClearCppValueHelper(&user_ip_);
  }


  /**
   * Gets the optional '<code>userIp</code>' attribute.
   *
   * If the value is not set then the default value will be returned.
   */
  const string& get_user_ip() const { return user_ip_; }

  /**
   * Gets a modifiable pointer to the optional <code>userIp</code>' attribute.
   *
   * @return  The value can be set by dereferencing the pointer.
   */
  string* mutable_userIp() {
    _have_user_ip_ = true;
    return &user_ip_;
  }


  /**
   * Sets the '<code>userIp</code>' attribute.
   *
   * @param[in] value IP address of the site where the request originates. Use
   * this if you want to enforce per-user limits.
   */
  void set_user_ip(const string& value) {
    _have_user_ip_ = true;
    user_ip_ = value;
  }

  /**
   * Appends variable value to the target string.
   *
   * This is a helper function used to resolve templated variables in the
   * URI supplied to the constructor.
   *
   * @param[in] variable_name  The name of the templated variable.
   * @param[in] config  A pass-through parameter used for lists and maps.
   * @param[in, out] target The string to append the value to.
   */
  virtual util::Status AppendVariable(
      const StringPiece& variable_name,
      const client::UriTemplateConfig& config,
      string* target);

  /**
   * Appends the optional query parameters to the target URL.
   *
   * @param[in, out] target  The URL string to append to.
   */
  virtual util::Status AppendOptionalQueryParameters(string* target);


 protected:
  /**
   * Prepares the method's HTTP request to send body content as JSON.
   *
   * Only to be used for method constructors.
   */
  void AddJsonContentToRequest(const client::JsonCppData *content);

 private:
  string alt_;
  string fields_;
  string key_;
  string oauth_token_;
  bool pretty_print_;
  string quota_user_;
  string user_ip_;
  bool _have_alt_ : 1;
  bool _have_fields_ : 1;
  bool _have_key_ : 1;
  bool _have_oauth_token_ : 1;
  bool _have_pretty_print_ : 1;
  bool _have_quota_user_ : 1;
  bool _have_user_ip_ : 1;

  DISALLOW_COPY_AND_ASSIGN(WaxServiceBaseRequest);
};



/**
 * Implements the delete method.
 *
 * @ingroup ServiceMethod
 *
 * This class uses the Command Pattern. Construct an instance with the required
 * parameters, then set any additional optional parameters by using the
 * attribute setters. To invoke the method, call <code>Execute</code>.
 *
 * One or more of these authorization scopes are required for this method:
 * https://www.googleapis.com/auth/xapi.zoo
 * https://www.googleapis.com/auth/xapi.zoo.readonly
 */
class ItemsResource_DeleteMethod : public WaxServiceBaseRequest {
 public:
  /**
   * The standard constructor takes all the required method parameters.
   * @param[in] _service_  The service instance to send to when executed.
   * @param[in] _credential_  If not NULL, the credential to authorize with.
   *            In practice this is supplied by the user code that is
   *            creating the method instance.
   * @param[in] session_id The session ID.
   * @param[in] item_id The item ID.
   */
  ItemsResource_DeleteMethod(
      const WaxService* _service_,
      client::AuthorizationCredential* _credential_,
      const StringPiece& session_id,
      const StringPiece& item_id);

  /**
   * Standard destructor.
   */
  virtual ~ItemsResource_DeleteMethod();


  /**
   * Appends variable value to the target string.
   *
   * This is a helper function used to resolve templated variables in the URI.
   *
   * @param[in] variable_name  The name of the templated variable.
   * @param[in] config  A pass-through parameter used for lists and maps.
   * @param[in, out] target The string to append the value to.
   */
  virtual util::Status AppendVariable(
        const StringPiece& variable_name,
        const client::UriTemplateConfig& config,
        string* target);


 private:
  string session_id_;
  string item_id_;
  DISALLOW_COPY_AND_ASSIGN(ItemsResource_DeleteMethod);
};

/**
 * Implements the get method.
 *
 * @ingroup ServiceMethod
 *
 * This class uses the Command Pattern. Construct an instance with the required
 * parameters, then set any additional optional parameters by using the
 * attribute setters. To invoke the method, call <code>Execute</code>.
 *
 * One or more of these authorization scopes are required for this method:
 * https://www.googleapis.com/auth/xapi.zoo
 * https://www.googleapis.com/auth/xapi.zoo.readonly
 */
class ItemsResource_GetMethod : public WaxServiceBaseRequest {
 public:
  /**
   * The standard constructor takes all the required method parameters.
   * @param[in] _service_  The service instance to send to when executed.
   * @param[in] _credential_  If not NULL, the credential to authorize with.
   *            In practice this is supplied by the user code that is
   *            creating the method instance.
   * @param[in] session_id The session ID.
   * @param[in] item_id The item ID.
   */
  ItemsResource_GetMethod(
      const WaxService* _service_,
      client::AuthorizationCredential* _credential_,
      const StringPiece& session_id,
      const StringPiece& item_id);

  /**
   * Standard destructor.
   */
  virtual ~ItemsResource_GetMethod();


  /**
   * Appends variable value to the target string.
   *
   * This is a helper function used to resolve templated variables in the URI.
   *
   * @param[in] variable_name  The name of the templated variable.
   * @param[in] config  A pass-through parameter used for lists and maps.
   * @param[in, out] target The string to append the value to.
   */
  virtual util::Status AppendVariable(
        const StringPiece& variable_name,
        const client::UriTemplateConfig& config,
        string* target);


  /**
   * Executes the method and parses the response into a data object on success.
   *
   * @param[out] data Loads from the response payload JSON data on success.
   *
   * @return Success if an HTTP 2xx response was received. Otherwise the
   *         status indicates the reason for failure. Finer detail may be
   *         available from the underlying http_request to distinguish the
   *         transport_status from the overal HTTP request status.
   */
  util::Status ExecuteAndParseResponse(
      WaxDataItem* data) {
    return WaxServiceBaseRequest::ExecuteAndParseResponse(data);
  }

 private:
  string session_id_;
  string item_id_;
  DISALLOW_COPY_AND_ASSIGN(ItemsResource_GetMethod);
};

/**
 * Implements the insert method.
 *
 * @ingroup ServiceMethod
 *
 * This class uses the Command Pattern. Construct an instance with the required
 * parameters, then set any additional optional parameters by using the
 * attribute setters. To invoke the method, call <code>Execute</code>.
 *
 * One or more of these authorization scopes are required for this method:
 * https://www.googleapis.com/auth/xapi.zoo
 * https://www.googleapis.com/auth/xapi.zoo.readonly
 */
class ItemsResource_InsertMethod : public WaxServiceBaseRequest {
 public:
  /**
   * The standard constructor takes all the required method parameters.
   * @param[in] _service_  The service instance to send to when executed.
   * @param[in] _credential_  If not NULL, the credential to authorize with.
   *            In practice this is supplied by the user code that is
   *            creating the method instance.
   * @param[in] session_id The session ID.
   * @param[in] _content_ The data object to insert.
   */
  ItemsResource_InsertMethod(
      const WaxService* _service_,
      client::AuthorizationCredential* _credential_,
      const StringPiece& session_id,
      const WaxDataItem& _content_);

  /**
   * Standard destructor.
   */
  virtual ~ItemsResource_InsertMethod();


  /**
   * Appends variable value to the target string.
   *
   * This is a helper function used to resolve templated variables in the URI.
   *
   * @param[in] variable_name  The name of the templated variable.
   * @param[in] config  A pass-through parameter used for lists and maps.
   * @param[in, out] target The string to append the value to.
   */
  virtual util::Status AppendVariable(
        const StringPiece& variable_name,
        const client::UriTemplateConfig& config,
        string* target);


  /**
   * Executes the method and parses the response into a data object on success.
   *
   * @param[out] data Loads from the response payload JSON data on success.
   *
   * @return Success if an HTTP 2xx response was received. Otherwise the
   *         status indicates the reason for failure. Finer detail may be
   *         available from the underlying http_request to distinguish the
   *         transport_status from the overal HTTP request status.
   */
  util::Status ExecuteAndParseResponse(
      WaxDataItem* data) {
    return WaxServiceBaseRequest::ExecuteAndParseResponse(data);
  }

 private:
  string session_id_;  string _content_;
  DISALLOW_COPY_AND_ASSIGN(ItemsResource_InsertMethod);
};

/**
 * Implements the list method.
 *
 * @ingroup ServiceMethod
 *
 * This class uses the Command Pattern. Construct an instance with the required
 * parameters, then set any additional optional parameters by using the
 * attribute setters. To invoke the method, call <code>Execute</code>.
 *
 * One or more of these authorization scopes are required for this method:
 * https://www.googleapis.com/auth/xapi.zoo
 * https://www.googleapis.com/auth/xapi.zoo.readonly
 */
class ItemsResource_ListMethod : public WaxServiceBaseRequest {
 public:
  /**
   * The standard constructor takes all the required method parameters.
   * @param[in] _service_  The service instance to send to when executed.
   * @param[in] _credential_  If not NULL, the credential to authorize with.
   *            In practice this is supplied by the user code that is
   *            creating the method instance.
   * @param[in] session_id The session ID.
   */
  ItemsResource_ListMethod(
      const WaxService* _service_,
      client::AuthorizationCredential* _credential_,
      const StringPiece& session_id);

  /**
   * Standard destructor.
   */
  virtual ~ItemsResource_ListMethod();


  /**
   * Appends variable value to the target string.
   *
   * This is a helper function used to resolve templated variables in the URI.
   *
   * @param[in] variable_name  The name of the templated variable.
   * @param[in] config  A pass-through parameter used for lists and maps.
   * @param[in, out] target The string to append the value to.
   */
  virtual util::Status AppendVariable(
        const StringPiece& variable_name,
        const client::UriTemplateConfig& config,
        string* target);


  /**
   * Executes the method and parses the response into a data object on success.
   *
   * @param[out] data Loads from the response payload JSON data on success.
   *
   * @return Success if an HTTP 2xx response was received. Otherwise the
   *         status indicates the reason for failure. Finer detail may be
   *         available from the underlying http_request to distinguish the
   *         transport_status from the overal HTTP request status.
   */
  util::Status ExecuteAndParseResponse(
      WaxListResponse* data) {
    return WaxServiceBaseRequest::ExecuteAndParseResponse(data);
  }

 private:
  string session_id_;
  DISALLOW_COPY_AND_ASSIGN(ItemsResource_ListMethod);
};

/**
 * Implements the patch method.
 *
 * @ingroup ServiceMethod
 *
 * This class uses the Command Pattern. Construct an instance with the required
 * parameters, then set any additional optional parameters by using the
 * attribute setters. To invoke the method, call <code>Execute</code>.
 *
 * One or more of these authorization scopes are required for this method:
 * https://www.googleapis.com/auth/xapi.zoo
 * https://www.googleapis.com/auth/xapi.zoo.readonly
 */
class ItemsResource_PatchMethod : public WaxServiceBaseRequest {
 public:
  /**
   * The standard constructor takes all the required method parameters.
   * @param[in] _service_  The service instance to send to when executed.
   * @param[in] _credential_  If not NULL, the credential to authorize with.
   *            In practice this is supplied by the user code that is
   *            creating the method instance.
   * @param[in] session_id The session ID.
   * @param[in] item_id The item ID.
   * @param[in] _content_ The data object to patch.
   */
  ItemsResource_PatchMethod(
      const WaxService* _service_,
      client::AuthorizationCredential* _credential_,
      const StringPiece& session_id,
      const StringPiece& item_id,
      const WaxDataItem& _content_);

  /**
   * Standard destructor.
   */
  virtual ~ItemsResource_PatchMethod();


  /**
   * Appends variable value to the target string.
   *
   * This is a helper function used to resolve templated variables in the URI.
   *
   * @param[in] variable_name  The name of the templated variable.
   * @param[in] config  A pass-through parameter used for lists and maps.
   * @param[in, out] target The string to append the value to.
   */
  virtual util::Status AppendVariable(
        const StringPiece& variable_name,
        const client::UriTemplateConfig& config,
        string* target);


  /**
   * Executes the method and parses the response into a data object on success.
   *
   * @param[out] data Loads from the response payload JSON data on success.
   *
   * @return Success if an HTTP 2xx response was received. Otherwise the
   *         status indicates the reason for failure. Finer detail may be
   *         available from the underlying http_request to distinguish the
   *         transport_status from the overal HTTP request status.
   */
  util::Status ExecuteAndParseResponse(
      WaxDataItem* data) {
    return WaxServiceBaseRequest::ExecuteAndParseResponse(data);
  }

 private:
  string session_id_;
  string item_id_;  string _content_;
  DISALLOW_COPY_AND_ASSIGN(ItemsResource_PatchMethod);
};

/**
 * Implements the subscribe method.
 *
 * @ingroup ServiceMethod
 *
 * This class uses the Command Pattern. Construct an instance with the required
 * parameters, then set any additional optional parameters by using the
 * attribute setters. To invoke the method, call <code>Execute</code>.
 *
 * One or more of these authorization scopes are required for this method:
 * https://www.googleapis.com/auth/xapi.zoo
 * https://www.googleapis.com/auth/xapi.zoo.readonly
 */
class ItemsResource_SubscribeMethod : public WaxServiceBaseRequest {
 public:
  /**
   * The standard constructor takes all the required method parameters.
   * @param[in] _service_  The service instance to send to when executed.
   * @param[in] _credential_  If not NULL, the credential to authorize with.
   *            In practice this is supplied by the user code that is
   *            creating the method instance.
   * @param[in] session_id The session ID.
   * @param[in] _content_ The data object to subscribe.
   */
  ItemsResource_SubscribeMethod(
      const WaxService* _service_,
      client::AuthorizationCredential* _credential_,
      const StringPiece& session_id,
      const Subscription& _content_);

  /**
   * Standard destructor.
   */
  virtual ~ItemsResource_SubscribeMethod();


  /**
   * Appends variable value to the target string.
   *
   * This is a helper function used to resolve templated variables in the URI.
   *
   * @param[in] variable_name  The name of the templated variable.
   * @param[in] config  A pass-through parameter used for lists and maps.
   * @param[in, out] target The string to append the value to.
   */
  virtual util::Status AppendVariable(
        const StringPiece& variable_name,
        const client::UriTemplateConfig& config,
        string* target);


  /**
   * Executes the method and parses the response into a data object on success.
   *
   * @param[out] data Loads from the response payload JSON data on success.
   *
   * @return Success if an HTTP 2xx response was received. Otherwise the
   *         status indicates the reason for failure. Finer detail may be
   *         available from the underlying http_request to distinguish the
   *         transport_status from the overal HTTP request status.
   */
  util::Status ExecuteAndParseResponse(
      Subscription* data) {
    return WaxServiceBaseRequest::ExecuteAndParseResponse(data);
  }

 private:
  string session_id_;  string _content_;
  DISALLOW_COPY_AND_ASSIGN(ItemsResource_SubscribeMethod);
};

/**
 * Implements the subscribeToOneItem method.
 *
 * @ingroup ServiceMethod
 *
 * This class uses the Command Pattern. Construct an instance with the required
 * parameters, then set any additional optional parameters by using the
 * attribute setters. To invoke the method, call <code>Execute</code>.
 *
 * One or more of these authorization scopes are required for this method:
 * https://www.googleapis.com/auth/xapi.zoo
 * https://www.googleapis.com/auth/xapi.zoo.readonly
 */
class ItemsResource_SubscribeToOneItemMethod : public WaxServiceBaseRequest {
 public:
  /**
   * The standard constructor takes all the required method parameters.
   * @param[in] _service_  The service instance to send to when executed.
   * @param[in] _credential_  If not NULL, the credential to authorize with.
   *            In practice this is supplied by the user code that is
   *            creating the method instance.
   * @param[in] session_id The session ID.
   * @param[in] item_id The item ID.
   * @param[in] _content_ The data object to subscribeToOneItem.
   */
  ItemsResource_SubscribeToOneItemMethod(
      const WaxService* _service_,
      client::AuthorizationCredential* _credential_,
      const StringPiece& session_id,
      const StringPiece& item_id,
      const Subscription& _content_);

  /**
   * Standard destructor.
   */
  virtual ~ItemsResource_SubscribeToOneItemMethod();


  /**
   * Appends variable value to the target string.
   *
   * This is a helper function used to resolve templated variables in the URI.
   *
   * @param[in] variable_name  The name of the templated variable.
   * @param[in] config  A pass-through parameter used for lists and maps.
   * @param[in, out] target The string to append the value to.
   */
  virtual util::Status AppendVariable(
        const StringPiece& variable_name,
        const client::UriTemplateConfig& config,
        string* target);


  /**
   * Executes the method and parses the response into a data object on success.
   *
   * @param[out] data Loads from the response payload JSON data on success.
   *
   * @return Success if an HTTP 2xx response was received. Otherwise the
   *         status indicates the reason for failure. Finer detail may be
   *         available from the underlying http_request to distinguish the
   *         transport_status from the overal HTTP request status.
   */
  util::Status ExecuteAndParseResponse(
      Subscription* data) {
    return WaxServiceBaseRequest::ExecuteAndParseResponse(data);
  }

 private:
  string session_id_;
  string item_id_;  string _content_;
  DISALLOW_COPY_AND_ASSIGN(ItemsResource_SubscribeToOneItemMethod);
};

/**
 * Implements the update method.
 *
 * @ingroup ServiceMethod
 *
 * This class uses the Command Pattern. Construct an instance with the required
 * parameters, then set any additional optional parameters by using the
 * attribute setters. To invoke the method, call <code>Execute</code>.
 *
 * One or more of these authorization scopes are required for this method:
 * https://www.googleapis.com/auth/xapi.zoo
 * https://www.googleapis.com/auth/xapi.zoo.readonly
 */
class ItemsResource_UpdateMethod : public WaxServiceBaseRequest {
 public:
  /**
   * The standard constructor takes all the required method parameters.
   * @param[in] _service_  The service instance to send to when executed.
   * @param[in] _credential_  If not NULL, the credential to authorize with.
   *            In practice this is supplied by the user code that is
   *            creating the method instance.
   * @param[in] session_id The session ID.
   * @param[in] item_id The item ID.
   * @param[in] _content_ The data object to update.
   */
  ItemsResource_UpdateMethod(
      const WaxService* _service_,
      client::AuthorizationCredential* _credential_,
      const StringPiece& session_id,
      const StringPiece& item_id,
      const WaxDataItem& _content_);

  /**
   * Standard destructor.
   */
  virtual ~ItemsResource_UpdateMethod();


  /**
   * Appends variable value to the target string.
   *
   * This is a helper function used to resolve templated variables in the URI.
   *
   * @param[in] variable_name  The name of the templated variable.
   * @param[in] config  A pass-through parameter used for lists and maps.
   * @param[in, out] target The string to append the value to.
   */
  virtual util::Status AppendVariable(
        const StringPiece& variable_name,
        const client::UriTemplateConfig& config,
        string* target);


  /**
   * Executes the method and parses the response into a data object on success.
   *
   * @param[out] data Loads from the response payload JSON data on success.
   *
   * @return Success if an HTTP 2xx response was received. Otherwise the
   *         status indicates the reason for failure. Finer detail may be
   *         available from the underlying http_request to distinguish the
   *         transport_status from the overal HTTP request status.
   */
  util::Status ExecuteAndParseResponse(
      WaxDataItem* data) {
    return WaxServiceBaseRequest::ExecuteAndParseResponse(data);
  }

 private:
  string session_id_;
  string item_id_;  string _content_;
  DISALLOW_COPY_AND_ASSIGN(ItemsResource_UpdateMethod);
};



/**
 * Implements the create method.
 *
 * @ingroup ServiceMethod
 *
 * This class uses the Command Pattern. Construct an instance with the required
 * parameters, then set any additional optional parameters by using the
 * attribute setters. To invoke the method, call <code>Execute</code>.
 *
 * One or more of these authorization scopes are required for this method:
 * https://www.googleapis.com/auth/xapi.zoo
 * https://www.googleapis.com/auth/xapi.zoo.readonly
 */
class SessionsResource_CreateMethod : public WaxServiceBaseRequest {
 public:
  /**
   * The standard constructor takes all the required method parameters.
   * @param[in] _service_  The service instance to send to when executed.
   * @param[in] _credential_  If not NULL, the credential to authorize with.
   *            In practice this is supplied by the user code that is
   *            creating the method instance.
   * @param[in] _content_ The data object to create.
   */
  SessionsResource_CreateMethod(
      const WaxService* _service_,
      client::AuthorizationCredential* _credential_,
      const WaxCreateSessionRequest& _content_);

  /**
   * Standard destructor.
   */
  virtual ~SessionsResource_CreateMethod();

  /**
   * Executes the method and parses the response into a data object on success.
   *
   * @param[out] data Loads from the response payload JSON data on success.
   *
   * @return Success if an HTTP 2xx response was received. Otherwise the
   *         status indicates the reason for failure. Finer detail may be
   *         available from the underlying http_request to distinguish the
   *         transport_status from the overal HTTP request status.
   */
  util::Status ExecuteAndParseResponse(
      WaxNewSessionResponse* data) {
    return WaxServiceBaseRequest::ExecuteAndParseResponse(data);
  }

 private:
  string _content_;
  DISALLOW_COPY_AND_ASSIGN(SessionsResource_CreateMethod);
};

/**
 * Implements the newSession method.
 *
 * @ingroup ServiceMethod
 *
 * This class uses the Command Pattern. Construct an instance with the required
 * parameters, then set any additional optional parameters by using the
 * attribute setters. To invoke the method, call <code>Execute</code>.
 *
 * One or more of these authorization scopes are required for this method:
 * https://www.googleapis.com/auth/xapi.zoo
 * https://www.googleapis.com/auth/xapi.zoo.readonly
 */
class SessionsResource_NewSessionMethod : public WaxServiceBaseRequest {
 public:
  /**
   * The standard constructor takes all the required method parameters.
   * @param[in] _service_  The service instance to send to when executed.
   * @param[in] _credential_  If not NULL, the credential to authorize with.
   *            In practice this is supplied by the user code that is
   *            creating the method instance.
   * @param[in] _content_ The data object to newSession.
   */
  SessionsResource_NewSessionMethod(
      const WaxService* _service_,
      client::AuthorizationCredential* _credential_,
      const WaxNewSessionRequest& _content_);

  /**
   * Standard destructor.
   */
  virtual ~SessionsResource_NewSessionMethod();


    /**
     * Clears the '<code>sessionName</code>' attribute so it is no longer set.
     */
    void clear_session_name() {
      _have_session_name_ = false;
      client::ClearCppValueHelper(&session_name_);
    }


    /**
     * Gets the optional '<code>sessionName</code>' attribute.
     *
     * If the value is not set then the default value will be returned.
     */
    const string& get_session_name() const { return session_name_; }

    /**
     * Gets a modifiable pointer to the optional <code>sessionName</code>'
     * attribute.
     *
     * @return  The value can be set by dereferencing the pointer.
     */
    string* mutable_sessionName() {
      _have_session_name_ = true;
      return &session_name_;
    }


    /**
     * Sets the '<code>sessionName</code>' attribute.
     *
     * @param[in] value Human-readable name that describes a session. This name
     * will be part of the session ID.
     */
    void set_session_name(const string& value) {
      _have_session_name_ = true;
      session_name_ = value;
    }

  /**
   * Appends variable value to the target string.
   *
   * This is a helper function used to resolve templated variables in the URI.
   *
   * @param[in] variable_name  The name of the templated variable.
   * @param[in] config  A pass-through parameter used for lists and maps.
   * @param[in, out] target The string to append the value to.
   */
  virtual util::Status AppendVariable(
        const StringPiece& variable_name,
        const client::UriTemplateConfig& config,
        string* target);

  /**
   * Appends the optional query parameters to the target URL.
   *
   * @param[in, out] target  The URL string to append to.
   */
  virtual util::Status AppendOptionalQueryParameters(string* target);


  /**
   * Executes the method and parses the response into a data object on success.
   *
   * @param[out] data Loads from the response payload JSON data on success.
   *
   * @return Success if an HTTP 2xx response was received. Otherwise the
   *         status indicates the reason for failure. Finer detail may be
   *         available from the underlying http_request to distinguish the
   *         transport_status from the overal HTTP request status.
   */
  util::Status ExecuteAndParseResponse(
      WaxNewSessionResponse* data) {
    return WaxServiceBaseRequest::ExecuteAndParseResponse(data);
  }

 private:
  string session_name_;
  bool _have_session_name_ : 1;  string _content_;
  DISALLOW_COPY_AND_ASSIGN(SessionsResource_NewSessionMethod);
};

/**
 * Implements the removeSession method.
 *
 * @ingroup ServiceMethod
 *
 * This class uses the Command Pattern. Construct an instance with the required
 * parameters, then set any additional optional parameters by using the
 * attribute setters. To invoke the method, call <code>Execute</code>.
 *
 * One or more of these authorization scopes are required for this method:
 * https://www.googleapis.com/auth/xapi.zoo
 * https://www.googleapis.com/auth/xapi.zoo.readonly
 */
class SessionsResource_RemoveSessionMethod : public WaxServiceBaseRequest {
 public:
  /**
   * The standard constructor takes all the required method parameters.
   * @param[in] _service_  The service instance to send to when executed.
   * @param[in] _credential_  If not NULL, the credential to authorize with.
   *            In practice this is supplied by the user code that is
   *            creating the method instance.
   * @param[in] _content_ The data object to removeSession.
   */
  SessionsResource_RemoveSessionMethod(
      const WaxService* _service_,
      client::AuthorizationCredential* _credential_,
      const WaxRemoveSessionRequest& _content_);

  /**
   * Standard destructor.
   */
  virtual ~SessionsResource_RemoveSessionMethod();


    /**
     * Clears the '<code>sessionId</code>' attribute so it is no longer set.
     */
    void clear_session_id() {
      _have_session_id_ = false;
      client::ClearCppValueHelper(&session_id_);
    }


    /**
     * Gets the optional '<code>sessionId</code>' attribute.
     *
     * If the value is not set then the default value will be returned.
     */
    const string& get_session_id() const { return session_id_; }

    /**
     * Gets a modifiable pointer to the optional <code>sessionId</code>'
     * attribute.
     *
     * @return  The value can be set by dereferencing the pointer.
     */
    string* mutable_sessionId() {
      _have_session_id_ = true;
      return &session_id_;
    }


    /**
     * Sets the '<code>sessionId</code>' attribute.
     *
     * @param[in] value The session ID.
     */
    void set_session_id(const string& value) {
      _have_session_id_ = true;
      session_id_ = value;
    }

  /**
   * Appends variable value to the target string.
   *
   * This is a helper function used to resolve templated variables in the URI.
   *
   * @param[in] variable_name  The name of the templated variable.
   * @param[in] config  A pass-through parameter used for lists and maps.
   * @param[in, out] target The string to append the value to.
   */
  virtual util::Status AppendVariable(
        const StringPiece& variable_name,
        const client::UriTemplateConfig& config,
        string* target);

  /**
   * Appends the optional query parameters to the target URL.
   *
   * @param[in, out] target  The URL string to append to.
   */
  virtual util::Status AppendOptionalQueryParameters(string* target);


  /**
   * Executes the method and parses the response into a data object on success.
   *
   * @param[out] data Loads from the response payload JSON data on success.
   *
   * @return Success if an HTTP 2xx response was received. Otherwise the
   *         status indicates the reason for failure. Finer detail may be
   *         available from the underlying http_request to distinguish the
   *         transport_status from the overal HTTP request status.
   */
  util::Status ExecuteAndParseResponse(
      WaxRemoveSessionResponse* data) {
    return WaxServiceBaseRequest::ExecuteAndParseResponse(data);
  }

 private:
  string session_id_;
  bool _have_session_id_ : 1;  string _content_;
  DISALLOW_COPY_AND_ASSIGN(SessionsResource_RemoveSessionMethod);
};



/**
 * Implements the unsubscribe method.
 *
 * @ingroup ServiceMethod
 *
 * This class uses the Command Pattern. Construct an instance with the required
 * parameters, then set any additional optional parameters by using the
 * attribute setters. To invoke the method, call <code>Execute</code>.
 *
 * One or more of these authorization scopes are required for this method:
 * https://www.googleapis.com/auth/xapi.zoo
 * https://www.googleapis.com/auth/xapi.zoo.readonly
 */
class SubscriptionsResource_UnsubscribeMethod : public WaxServiceBaseRequest {
 public:
  /**
   * The standard constructor takes all the required method parameters.
   * @param[in] _service_  The service instance to send to when executed.
   * @param[in] _credential_  If not NULL, the credential to authorize with.
   *            In practice this is supplied by the user code that is
   *            creating the method instance.
   * @param[in] _content_ The data object to unsubscribe.
   */
  SubscriptionsResource_UnsubscribeMethod(
      const WaxService* _service_,
      client::AuthorizationCredential* _credential_,
      const Subscription& _content_);

  /**
   * Standard destructor.
   */
  virtual ~SubscriptionsResource_UnsubscribeMethod();

 private:
  string _content_;
  DISALLOW_COPY_AND_ASSIGN(SubscriptionsResource_UnsubscribeMethod);
};



/**
 * Service definition for WaxService (v1).
 *
 * @ingroup ServiceClass
 *
 * For more information about this service, see the API Documentation at
 * <a href='http://go/apiarytesting/wax-api'>'http://go/apiarytesting/wax-api</a>
 */
class WaxService : public client::ClientService {
 public:
  /**
   * The name of the API that this was generated from.
   */
  static const StringPiece googleapis_API_NAME;

  /**
   * The version of the API that this interface was generated from.
   */
  static const StringPiece googleapis_API_VERSION;

  /**
   * The code generator used to generate this API.
   */
  static const StringPiece googleapis_API_GENERATOR;


  /**
   * Acts as message factory for accessing  data.
   *
   * @ingroup ServiceClass
   */
  class ItemsResource {
   public:
    /**
     * Standard constructor.
     *
     * @param[in] service  The service instance is used to bind to the
     *            methods created from this resource instance.  This will be
     *            the service that methods are invoked on.
     */
    explicit ItemsResource(WaxService* service);

    /**
     * Standard destructor.
     */
    ~ItemsResource() {}


    /**
     * Creates a new ItemsResource_DeleteMethod instance.
     *
     * @param[in] _credential_  Can be NULL.
     *            NULL credentials will not authorize the request.
     * @param[in] session_id The session ID.
     * @param[in] item_id The item ID.
     * @returns  The caller should <code>Execute</code> the method instance,
     *           then destroy it when they are finished.
     */
    ItemsResource_DeleteMethod* NewDeleteMethod(
        client::AuthorizationCredential* _credential_,
        const StringPiece& session_id,
        const StringPiece& item_id) const;

    /**
     * Creates a new ItemsResource_GetMethod instance.
     *
     * @param[in] _credential_  Can be NULL.
     *            NULL credentials will not authorize the request.
     * @param[in] session_id The session ID.
     * @param[in] item_id The item ID.
     * @returns  The caller should <code>Execute</code> the method instance,
     *           then destroy it when they are finished.
     */
    ItemsResource_GetMethod* NewGetMethod(
        client::AuthorizationCredential* _credential_,
        const StringPiece& session_id,
        const StringPiece& item_id) const;

    /**
     * Creates a new ItemsResource_InsertMethod instance.
     *
     * @param[in] _credential_  Can be NULL.
     *            NULL credentials will not authorize the request.
     * @param[in] session_id The session ID.
     * @param[in] _content_ The data object to insert.
     * @returns  The caller should <code>Execute</code> the method instance,
     *           then destroy it when they are finished.
     */
    ItemsResource_InsertMethod* NewInsertMethod(
        client::AuthorizationCredential* _credential_,
        const StringPiece& session_id,
        const WaxDataItem& _content_) const;

    /**
     * Creates a new ItemsResource_ListMethod instance.
     *
     * @param[in] _credential_  Can be NULL.
     *            NULL credentials will not authorize the request.
     * @param[in] session_id The session ID.
     * @returns  The caller should <code>Execute</code> the method instance,
     *           then destroy it when they are finished.
     */
    ItemsResource_ListMethod* NewListMethod(
        client::AuthorizationCredential* _credential_,
        const StringPiece& session_id) const;

    /**
     * Creates a new ItemsResource_PatchMethod instance.
     *
     * @param[in] _credential_  Can be NULL.
     *            NULL credentials will not authorize the request.
     * @param[in] session_id The session ID.
     * @param[in] item_id The item ID.
     * @param[in] _content_ The data object to patch.
     * @returns  The caller should <code>Execute</code> the method instance,
     *           then destroy it when they are finished.
     */
    ItemsResource_PatchMethod* NewPatchMethod(
        client::AuthorizationCredential* _credential_,
        const StringPiece& session_id,
        const StringPiece& item_id,
        const WaxDataItem& _content_) const;

    /**
     * Creates a new ItemsResource_SubscribeMethod instance.
     *
     * @param[in] _credential_  Can be NULL.
     *            NULL credentials will not authorize the request.
     * @param[in] session_id The session ID.
     * @param[in] _content_ The data object to subscribe.
     * @returns  The caller should <code>Execute</code> the method instance,
     *           then destroy it when they are finished.
     */
    ItemsResource_SubscribeMethod* NewSubscribeMethod(
        client::AuthorizationCredential* _credential_,
        const StringPiece& session_id,
        const Subscription& _content_) const;

    /**
     * Creates a new ItemsResource_SubscribeToOneItemMethod instance.
     *
     * @param[in] _credential_  Can be NULL.
     *            NULL credentials will not authorize the request.
     * @param[in] session_id The session ID.
     * @param[in] item_id The item ID.
     * @param[in] _content_ The data object to subscribeToOneItem.
     * @returns  The caller should <code>Execute</code> the method instance,
     *           then destroy it when they are finished.
     */
    ItemsResource_SubscribeToOneItemMethod* NewSubscribeToOneItemMethod(
        client::AuthorizationCredential* _credential_,
        const StringPiece& session_id,
        const StringPiece& item_id,
        const Subscription& _content_) const;

    /**
     * Creates a new ItemsResource_UpdateMethod instance.
     *
     * @param[in] _credential_  Can be NULL.
     *            NULL credentials will not authorize the request.
     * @param[in] session_id The session ID.
     * @param[in] item_id The item ID.
     * @param[in] _content_ The data object to update.
     * @returns  The caller should <code>Execute</code> the method instance,
     *           then destroy it when they are finished.
     */
    ItemsResource_UpdateMethod* NewUpdateMethod(
        client::AuthorizationCredential* _credential_,
        const StringPiece& session_id,
        const StringPiece& item_id,
        const WaxDataItem& _content_) const;

   private:
    WaxService* service_;

    DISALLOW_COPY_AND_ASSIGN(ItemsResource);
  };

  /**
   * Acts as message factory for accessing  data.
   *
   * @ingroup ServiceClass
   */
  class SessionsResource {
   public:
    /**
     * Standard constructor.
     *
     * @param[in] service  The service instance is used to bind to the
     *            methods created from this resource instance.  This will be
     *            the service that methods are invoked on.
     */
    explicit SessionsResource(WaxService* service);

    /**
     * Standard destructor.
     */
    ~SessionsResource() {}


    /**
     * Creates a new SessionsResource_CreateMethod instance.
     *
     * @param[in] _credential_  Can be NULL.
     *            NULL credentials will not authorize the request.
     * @param[in] _content_ The data object to create.
     * @returns  The caller should <code>Execute</code> the method instance,
     *           then destroy it when they are finished.
     */
    SessionsResource_CreateMethod* NewCreateMethod(
        client::AuthorizationCredential* _credential_,
        const WaxCreateSessionRequest& _content_) const;

    /**
     * Creates a new SessionsResource_NewSessionMethod instance.
     *
     * @param[in] _credential_  Can be NULL.
     *            NULL credentials will not authorize the request.
     * @param[in] _content_ The data object to newSession.
     * @returns  The caller should <code>Execute</code> the method instance,
     *           then destroy it when they are finished.
     */
    SessionsResource_NewSessionMethod* NewNewSessionMethod(
        client::AuthorizationCredential* _credential_,
        const WaxNewSessionRequest& _content_) const;

    /**
     * Creates a new SessionsResource_RemoveSessionMethod instance.
     *
     * @param[in] _credential_  Can be NULL.
     *            NULL credentials will not authorize the request.
     * @param[in] _content_ The data object to removeSession.
     * @returns  The caller should <code>Execute</code> the method instance,
     *           then destroy it when they are finished.
     */
    SessionsResource_RemoveSessionMethod* NewRemoveSessionMethod(
        client::AuthorizationCredential* _credential_,
        const WaxRemoveSessionRequest& _content_) const;

   private:
    WaxService* service_;

    DISALLOW_COPY_AND_ASSIGN(SessionsResource);
  };

  /**
   * Acts as message factory for accessing  data.
   *
   * @ingroup ServiceClass
   */
  class SubscriptionsResource {
   public:
    /**
     * Standard constructor.
     *
     * @param[in] service  The service instance is used to bind to the
     *            methods created from this resource instance.  This will be
     *            the service that methods are invoked on.
     */
    explicit SubscriptionsResource(WaxService* service);

    /**
     * Standard destructor.
     */
    ~SubscriptionsResource() {}


    /**
     * Creates a new SubscriptionsResource_UnsubscribeMethod instance.
     *
     * @param[in] _credential_  Can be NULL.
     *            NULL credentials will not authorize the request.
     * @param[in] _content_ The data object to unsubscribe.
     * @returns  The caller should <code>Execute</code> the method instance,
     *           then destroy it when they are finished.
     */
    SubscriptionsResource_UnsubscribeMethod* NewUnsubscribeMethod(
        client::AuthorizationCredential* _credential_,
        const Subscription& _content_) const;

   private:
    WaxService* service_;

    DISALLOW_COPY_AND_ASSIGN(SubscriptionsResource);
  };



  /**
   * Standard constructor.
   *
   * @param[in] transport  The transport to use when creating methods to invoke
   *                       on this service instance.
   */
  explicit WaxService(client::HttpTransport* transport);

  /**
   * Standard destructor.
   */
  virtual ~WaxService();

  /**
   * Gets the  resource method factory.
   *
   * @return ItemsResource for creating methods.
   */
  const ItemsResource& get_items() const {
    return items_;
  }


  /**
   * Gets the  resource method factory.
   *
   * @return SessionsResource for creating methods.
   */
  const SessionsResource& get_sessions() const {
    return sessions_;
  }


  /**
   * Gets the  resource method factory.
   *
   * @return SubscriptionsResource for creating methods.
   */
  const SubscriptionsResource& get_subscriptions() const {
    return subscriptions_;
  }

  /**
   * Declares the OAuth2.0 scopes used within Wax API
   *
   * These scopes shoudl be used when asking for credentials to invoke methods
   * in the WaxService.
   */
  class SCOPES {
   public:
    /**
     * Test scope for access to the Zoo service.
     */
    static const StringPiece XAPI_ZOO;

    /**
     * Test scope for readonly access to the Zoo service.
     */
    static const StringPiece XAPI_ZOO_READONLY;

   private:
    SCOPES();  // Never instantiated.
    ~SCOPES();  // Never instantiated.
  };

 private:
  ItemsResource items_;
  SessionsResource sessions_;
  SubscriptionsResource subscriptions_;

  DISALLOW_COPY_AND_ASSIGN(WaxService);
};


/**
 * @defgroup DataObject Wax API Data Objects
 *
 * The data objects are used as parameters and responses from service requests.
 * For more information about using data objects, see the
 * <a href='https://developers.google.com/api-client-library/cpp/'>
 * Google APIs Client Library for C++ Developers's Guide</a>.
 */

/**
 * @defgroup ServiceClass Wax API Service
 *
 * The service classes contain information about accessing and using the
 * Wax API cloud service.
 *
 * For more information about using services, see the
 * <a href='https://developers.google.com/api-client-library/cpp/'>
 * Google APIs Client Library for C++ Developers's Guide</a>.
 */

/**
 * @defgroup ServiceMethod Wax API Service Methods
 *
 * The service method classes are used to create and invoke methods in the
 * WaxService to access the Wax API.
 *
 * For more information about using services, see the
 * <a href='https://developers.google.com/api-client-library/cpp/'>
 * Google APIs Client Library for C++ Developers's Guide</a>.
 */
}  // namespace google_wax_api
#endif  // GOOGLE_WAX_API_WAX_SERVICE_H_
